#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

/*
 *    A simple filter for the templates
 */

int main(int argc, char *argv[])
{
    char buf[1024];
    char *vec[8192];
    char *fvec[200];
    char **svec;
    char type[64];
    int i;
    int vp=2;
    int ret=0;
    pid_t pid;


    if(chdir(getenv("TOPDIR")))
    {
        perror("chdir");
        exit(1);
    }

    /*
     *    Build the exec array ahead of time.
     */
    vec[0]="kernel-doc";
    vec[1]="-docbook";
    for(i=1;vp<8189;i++)
    {
        if(argv[i]==NULL)
            break;
        vec[vp++]=type;
        vec[vp++]=argv[i];
    }
    vec[vp++]=buf+2;
    vec[vp++]=NULL;

    /*
     *    Now process the template
     */

    while(fgets(buf, 1024, stdin))
    {
        if(*buf!='!') {
            printf("%s", buf);
            continue;
        }

        fflush(stdout);
        svec = vec;
        if(buf[1]=='E')
            strcpy(type, "-function");
        else if(buf[1]=='I')
            strcpy(type, "-nofunction");
        else if(buf[1]=='F') {
            int snarf = 0;
            fvec[0] = "kernel-doc";
            fvec[1] = "-docbook";
            strcpy (type, "-function");
            vp = 2;
            for (i = 2; buf[i]; i++) {
                if (buf[i] == ' ' || buf[i] == '\n') {
                    buf[i] = '\0';
                    snarf = 1;
                    continue;
                }

                if (snarf) {
                    snarf = 0;
                    fvec[vp++] = type;
                    fvec[vp++] = &buf[i];
                }
            }
            fvec[vp++] = &buf[2];
            fvec[vp] = NULL;
            svec = fvec;
        } else
        {
            fprintf(stderr, "Unknown ! escape.\n");
            exit(1);
        }
        switch(pid=fork())
        {
        case -1:
            perror("fork");
            exit(1);
        case  0:
            execvp("scripts/kernel-doc", svec);
            perror("exec scripts/kernel-doc");
            exit(1);
        default:
            waitpid(pid, &ret ,0);
        }
    }
    exit(ret);
}
